%option yylineno
%{
// Identifica a sintaxe da MiniJava
#include <stdio.h>
#include <stdlib.h>
int debug;
%}

DIG			[0-9]
LETRA			[a-zA-Z]
ID			({LETRA}|"_")({LETRA}|{DIG}|"_")*
LITERALINT      	{DIG}+
ESPB			[\n\t ]+
COMENT			("//".*\n)
OPLN			"!"
INT			"int"
BOOLEAN			"boolean"
INTVECTOR		"int[]" 

CLASS 			"class"
PUBLIC			"public"
STATIC			"static"
VOID			"void"
MAIN			"main"
STRING			"String"
EXTENDS			"extends"
RETURN			"return"
NEW			"new"
LENGTH			"length"
IF			"if"
WHILE			"while"
ELSE			"else"
TRUE			"true"
FALSE			"false"
THIS			"this"
SYSTEMOUTPRINTLN	"System.out.println"
MAIS			"+"
MENOS			"-"
VEZES			"*"
DIV			"/"
AND			"&&"
OR			"||"
MENOR			"<"
MENORIG			"<="
MAIOR			">"
MAIORIG			">="
DIF			"!="
IGUAL			"=="
XF			"}"
XA			"{"
PA			"("
PF			")"
CA			"["
CF			"]"
IG			"="
PT			"."
V			","
PV			";"


%x comentario1
%x comentario2

%%
        int num_linea = 1;
        int invocador_comentario;

"/*"         {
             invocador_comentario = INITIAL;
             BEGIN(comentario1);
             }

<comentario1>[^*\n]* 
<comentario1>"*"+[^*/\n]* 
<comentario1>\n             ++num_linea;
<comentario1>"*"+"/"        BEGIN(invocador_comentario);

"/**"     {
             invocador_comentario = INITIAL;
             BEGIN(comentario2);
             }

<comentario2>[^*\n]* 
<comentario2>"*"+[^*/\n]* 
<comentario2>\n             ++num_linea;
<comentario2>"*"+"/"        BEGIN(invocador_comentario);

{COMENT}		;
{ESPB}			;
{CLASS}         	{if(debug) printf("CLASS "); return CLASS;}
{PUBLIC}         	{if(debug) printf("PUBLIC "); return PUBLIC;}
{STATIC}         	{if(debug) printf("STATIC "); return STATIC;}
{VOID}           	{if(debug) printf("VOID "); return VOID;}
{MAIN}           	{if(debug) printf("MAIN "); return MAIN;}
{STRING}         	{if(debug) printf("STRING "); return STRING;}
{EXTENDS}        	{if(debug) printf("EXTENDS "); return EXTENDS;}
{RETURN}         	{if(debug) printf("RETURN "); return RETURN;}
{NEW}			{if(debug) printf("NEW "); return NEW;}
{LENGTH}		{if(debug) printf("LENGTH "); return LENGTH;}
{IF}			{if(debug) printf("IF "); return IF;}
{WHILE}			{if(debug) printf("WHILE "); return WHILE;}
{ELSE}			{if(debug) printf("ELSE "); return ELSE;}
{TRUE}			{if(debug) printf("TRUE "); return TRUE;}
{FALSE}			{if(debug) printf("FALSE "); return FALSE;}
{THIS}			{if(debug) printf("THIS "); return THIS;}
{SYSTEMOUTPRINTLN} 	{if(debug) printf("PRINTLN "); return SYSTEMOUTPRINTLN;}
{MAIS}			{if(debug) printf("MAIS "); return MAIS;}
{MENOS}			{if(debug) printf("MENOS "); return MENOS;}
{VEZES}			{if(debug) printf("VEZES "); return VEZES;}
{DIV} 			{if(debug) printf("DIVIDIDO "); return DIV;}
{AND}			{if(debug) printf("AND "); return AND;}
{OR}			{if(debug) printf("OR "); return OR;}
{MENOR}			{if(debug) printf("MENOR "); return MENOR;}
{MENORIG}		{if(debug) printf("MENOR OU IGUAL "); return MENORIG;}
{MAIOR}			{if(debug) printf("MAIOR "); return MAIOR;}
{MAIORIG}		{if(debug) printf("MAIOR OU IGUAL "); return MAIORIG;}
{DIF}			{if(debug) printf("DIFERENTE "); return DIF;}
{IGUAL}			{if(debug) printf("IGUAL "); return IGUAL;}
{XF}		 	{if(debug) printf("XF "); return XF;}
{XA}		 	{if(debug) printf("XA "); return XA;}
{PA}		 	{if(debug) printf("PA "); return PA;}
{PF}		 	{if(debug) printf("PF "); return PF;}
{CA}		 	{if(debug) printf("CA "); return CA;}
{CF}		 	{if(debug) printf("CF "); return CF;}
{IG}		 	{if(debug) printf("ATRIBUICAO "); return IG;}
{PT}		 	{if(debug) printf("PONTO "); return PT;}
{V}		 	{if(debug) printf("VIRGULA "); return V;}
{PV}              	{if(debug) printf("PTVIRGULA "); return PV;}
{INT}			{if(debug) printf("INT "); return INT;}
{BOOLEAN}		{if(debug) printf("BOOLEAN "); return BOOLEAN;}
{INTVECTOR}		{if(debug) printf("VETOR DE INT "); return INTVECTOR;}
{ID}		 	{ yylval = strdup(yytext); if(debug) printf("ID "); return ID;}  
{LITERALINT}     	{ yylval = strdup(yytext); if(debug) printf("LITERAL INT "); return LITERALINT;}
{OPLN}		 	{if(debug) printf("NOT "); return OPLN;}
.			;


%%

yywrap()
{
	return 1;
}
